#include "Servidor.h"


Servidor::Servidor(std::string scenarioName){
	clientes =  new ColaClientes();
	mensajesServer = new ColaMensajesRecibirServer(SERVER_OWN);
	this->game = new BattleMasterServer(scenarioName);
	conexiones = new Welcomer(clientes,game,mensajesServer);
	this->syncronizer = new PlayersSyncronizer(mensajesServer);
}

void Servidor::iniciar(unsigned int puerto,unsigned int maxConexiones){
	conectado = true;
	escucharConexiones(puerto,maxConexiones);
	syncronizer->start();
}

void Servidor::escucharConexiones(unsigned int puerto,unsigned int maxConexiones){
	conexiones->iniciar(puerto,maxConexiones);
	conexiones->start();
}

void Servidor::terminar(){

	//Levanto la bandera de apagado
	conectado = false;

	syncronizer->terminar();
	syncronizer->join();

	mensajesServer->terminar();


	conexiones->terminar();
	mensajesServer->signal();
	conexiones->join();


}

bool Servidor::isRunning(){
	return conectado;
}

void* Servidor::run(){
	while(conectado){
		//Obtengo el mensaje de la cola
		DTO* dto = mensajesServer->getMensaje();

		if(!dto)
			continue;
		//Lo propago
		this->propagarDTO(dto);
	}

	return NULL;
}

//Para cada uno de los clientes le inserto el dto
void Servidor::propagarDTO(DTO* dto){
	//Verifico el estado de los clientes antes de mandar un eventoo.
	//Este proceso puede ser medio lento, buscar alguna alternativoa
	clientes->limpiarDesconectados();

	clientes->propagarDTO(dto);
}


Servidor::~Servidor() {

	delete conexiones;

	delete clientes;

	delete mensajesServer;
}
